/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package fr.afcepf.projet2.metiers.donnees.dao.interfaces;

import java.io.Serializable;
import java.util.List;
import java.util.Map;
import javax.ejb.EJBException;
import javax.persistence.EntityManager;

/**
 * Interface générique d'accès aux données
 *
 * @author Sylvain
 */
public interface IDaoGeneric<T, PK extends Serializable> extends Serializable{

    /**
     * Obtient le type de classe correspondant à l'entité à traiter
     *
     * @return T Classe de l'entité
     */
    Class<T> obtientClasseEntite();

    /**
     * Obtient une entité par son identifiant
     *
     * @param id identifiant de l'entité
     * @return entité désirée
     */
    T obtenirParId(final PK id) throws EJBException;

    /**
     * Recherche une entité par des NAmed Queries et des arguements
     *
     * @param namedQuery nom de la requête à executer
     * @param args arguments nécessaires à l'exécution de la requête
     * @return Listes d'entités correspondant à la requête
     */
    List<T> rechercherParNamedQueryEtArguments(
            final String namedQuery,
            final Map<String, ? extends Object> args)
   throws EJBException;

        /**
     * Recherche d'entités par des NAmed Queries sans arguments
     * @param namedQuery nom de la requête à executer
     * @return Listes d'entités correspondant à la requête
     */
     public List<T> rechercherParNamedQuery(final String namedQuery)
              throws EJBException;
 
    /**
     * Supprimer une entité par son identifiant
     *
     * @param id identifiant de l'entité à supprimer
     * @return True si l'opération s'est bien déroulée
     */
    void supprimerParId(final PK id) throws EJBException;

    /**
     * Supprimer une entité
     *
     * @param entite entité à supprimer
     * @return True si l'opération s'est bien déroulée
     */
    void supprimer(final T entite) throws EJBException;

    /**
     * Modifier une entité
     *
     * @param entite entité à modifier
     * @return retourne l'entité modifiée
     */
    void modifier(final T entite) throws EJBException;

    /**
     * Modifier une entité par son identifiant
     *
     * @param id identifiant de l'entité à modifier
     * @return retourne l'entité modifiée
     */
    void modifierParId(final PK id) throws EJBException;

    /**
     * Permet d'ajouter une entité dans la base de données
     *
     * @param entite entité à ajouter
     * @return retourne l'entité ajoutée
     */
    T ajouter(T entite) throws EJBException;

    /**
     * Obtient l'entityManager de l'entité
     *
     * @return
     */
    public EntityManager obtenirEntityManager() throws EJBException;
}
